#include <stdio.h>

int main()
{
#if 0
    char s[2][10] =
    {
        "suqian",
        "jiaoyu"
    };

    printf("%s\n", s);  // s代表指向第一行的数组指针，%s打印就是 suqian
    printf("%d\n", *s); // *s取出数组的首元素地址，也就是第一个字母s的地址
    printf("%c\n", **s);    //再取*就是取出它的值 s
    printf("%c\n", *s[0]);  //s是第一个数组，s[0]就是第一个数组的第一个元素，*s[0]就是取它的值 s
    printf("%c\n", *s[0] + 1);  //*s[0]是字母s，+1就是其ASCII码值+1，就是字母 t
    printf("%c\n", *(s[0] + 1));    //s[0]是第一个数组第一个元素的首地址，+1就是往后走一个字节到u的地址，再取*就是取它的值 u
    printf("%c\n", *(*(s+1) + 1));  //s是第一行，+1到第二行，取*就是取第二行的首元素，再+1到第二个元素，再取*就是取它的值 i
    printf("%c\n", **(&s[0] + 1));  //s[0]是第一个数组的首元素地址，取它的地址也就是第一个数组的地址，+1到第二个数组，取*就得到第二个数组的首元素地址，再取*就是取它的值 j
#endif

#if 1
    char* s[2];    //指针数组：一维数组中的每个元素都是指针

    s[0] = "hello"; //s[0]指向字符串"hello"
    s[1] = "world"; //s[1]指向字符串"world"
    printf("%s\n", s[0]);   //s[0]是一个字符串指针，指向字符串 hello
    printf("%c\n", *s[0]);  //取*就是取这个字符串的第一个字母 h
    printf("%s\n", s);  //s是这个二维数组的首地址
    printf("%s\n", *s); //*s就是这个二维数组的第一个元素，也就是s[0]，s[0]是字符串hello的首地址，所以*s取的就是字符串本身 hello
    printf("%s\n", *(s+1)); //s指向第一个元素s[0]，+1指向第二个元素s[1],取*就是字符串world的首地址，%s就输出 world
    printf("%s\n", *(&s[0] + 1));   //s[0]是第一个字符串指针，取它地址就是取hello的首地址，+1就是第二个字符串指针的地址，取*就是取第二个指针的值，也就是world的地址，%s输出就是 world,等价于*(s + 1)
#endif

#if 0
    char* s[2][3] = 
    {
        {"hello", "world", "jack"},
        {"你好", "世界", "杰克"}
    };

    printf("%s\n", s[0][0]);
    printf("%c\n", s[0][0][0]);   //三级指针
    printf("%s\n", *(*(s+0)+1));
    printf("%d\n", **(*(s+0)+1));

#endif
    return 0;
}